<?php
namespace hclient\formatters;

use hclient\base\File;
use hclient\base\Request;

/**
 * 文件上传格式化器
 *<B>说明：</B>
 *<pre>
 * Stream 上传文件格式
 *</pre>
 */
class FileFormatter implements FormatterInterface
{
    public function format(Request $request):void
    {
        // 构建 multipart 边界（必须是唯一字符串）
        $boundary = '--' . bin2hex(random_bytes(8));
        // 手动构建 multipart 内容体
        $content = '';
        foreach ($request->getRequestData() as $name => $value) {
            // 文本字段处理
            if ($value instanceof File || $value instanceof \CURLFile) {
                $file = $value->name;
                // 获取文件内容和 MIME 类型
                $mimeType = $value->getMimeType() ? : 'application/octet-stream';
                $content .= '--' . $boundary . "\r\n" .
                    'Content-Disposition: form-data; name="' . $name . '"; filename="' . $value->getFilename() . '"'. "\r\n" .
                    'Content-Type:'. $mimeType . "\r\n\r\n" .
                    file_get_contents($file) . "\r\n";
            } else {
                $content .= '--' . $boundary ."\r\n" .
                    'Content-Disposition: form-data; name="' . $name . '"' . "\r\n\r\n" .
                    $value . "\r\n";
            }
        }
        $content .= '--' . $boundary ."--\r\n";
        $request->getHeaders()->set('Content-Type', 'multipart/form-data;boundary=' . $boundary);
        $request->getHeaders()->set('Content-Length', strlen($content));
        $request->setContent($content);

    }
}
